缘起

在项目中, 通常都会使用代码检测工具来规范团队的代码风格, 比如eslint。随着代码的不断增加, eslint进行代码检测的时间也越来越久。每次检测的时候, 需要检测的文件和实际检测的文件极度不对称,所以便基于git diff写了这样一个小工具。

2016/11/02更新

由于之前对于一系列的命令不够熟悉,在脚本中同时使用了nodejsbash, 并且通过文件来传递信息, 以下为改良后版本, 纯bash.

#!/bin/bash
INFO='\033[36m';
NOR='\033[0m';
ERR='\033[31m';
br='dev';
echo -e "${INFO}run lint now ... just wait a moment ...${NOR}";
if [ $1 ]; then
  br=$1;
fi;

log=`git diff origin/${br} --name-only | grep js | grep src/`;
if [ -z "${log}" ]; then
  echo -e "${INFO}No file changed, exit now ${NOR}";
  exit 0;
fi;
node ./node_modules/eslint/bin/eslint.js $log | grep error -C 1000 --color=auto;

源代码

  • 启动脚本(lint.sh)

#!/bin/bash
INFO='\033[36m';
NOR='\033[0m';
ERR='\033[31m';
br='dev';
echo -e "${INFO}run lint now ... just wait a moment ...${NOR}";
if [ $1 ]; then
  br=$1;
fi;

git diff origin/${br} > diff.log;
log=`cat diff.log | grep 'diff --git a/src'`;
if [[ -z ${log} ]]; then
  echo -e "${INFO}没有文件发生变化${NOR}";
else
  echo '';
  node ./lint-by-diff.js;
  echo -e "${INFO}done ...${NOR}";
fi;
rm diff.log change.log 2> /dev/null
read;
  • 检测工具(lint-by-diff.js)

const fs = require('fs');
const shelljs = require('shelljs');

const jsFiles = [],
  LOG__PATH   = './diff.log',
  FILE = /diff --git a([\s\S]*?) /g,
  data = fs.readFileSync(LOG__PATH).toString(),
  _files = data.match(FILE),
  len = _files.length;

let i = 0;
while (i < len) {
  const _item = _files[i++].trim();
  if (!/.js$/.test(_item)) continue;
  const item = './' + _item.slice(13);
  if (!/^\.\/src\//.test(item)) continue; // src为eslint需要检测的顶级目录
  if (!fs.existsSync(item)) continue;
  jsFiles.push(item);
}
if (jsFiles.length === 0) {
  console.log('没有文件发生变化');
  console.log('');
  process.exit(1);
}
console.log('------------------------------');
console.log('     以下文件发生改变: ');
console.log(jsFiles.join('\n'));
console.log('------------------------------');
shelljs.exec('node ./node_modules/eslint/bin/eslint.js ' + jsFiles.join(' '));

原理

通过git diff origin/dev获取到和dev分支的不同, 从而知道哪些文件需要进行代码检测(dev上的是通过检测的), 然后运行eslint的时候就指定这部分文件。

使用

在项目根目录下输入./lint.sh或者bash ./lint.sh, 默认的远程分支是dev, 如果需要和其他分支比较的话, 指定远程分支名,比如./lint.sh master

不足

  • 使用了bash, 导致这个看起来有点不伦不类, 使用纯js也许会更好, 但是我毕竟半吊子→_←

  • 没有对error进行高亮显示, 所以看起来还是会比较费力


374632897
160 声望0 粉丝

一只奋力前行的前端小虾蟹 o(╯□╰)o